<script setup lang="ts">
/**
 * 仓库数据导入组件
 * 封装仓库数据导入功能的代理组件
 */

import { defineExpose, ref } from 'vue';

import { ImportApi } from '#/api/import';
import DataImport from '#/components/data-import/DataImport.vue';

// 定义组件发出的事件类型
interface ImportEmits {
  (e: 'import-success', data: any): void;
  (e: 'import-error', error: any): void;
}

// 定义事件发射器
const emit = defineEmits<ImportEmits>();

/**
 * 仓库字段列表配置
 * 用于Excel导入时的字段映射
 */
const warehouseFields = ref([
  { label: '仓库编码', value: 'warehouse_code' },
  { label: '仓库名称', value: 'warehouse_name' },
  { label: '仓库类型', value: 'warehouse_type' },
  { label: '负责人', value: 'manager' },
  { label: '联系电话', value: 'contact_phone' },
  { label: '地址', value: 'address' },
  { label: '备注', value: 'remark' },
  { label: '启用状态', value: 'status' },
]);

// DataImport组件引用
const dataImportRef = ref<InstanceType<typeof DataImport>>();

// 存储当前上传的文件，用于后续API调用
let currentFile: File | null = null;

/**
 * 适配函数：获取Excel文件中的工作表名称
 * @param formData 包含文件的FormData
 * @returns 工作表名称列表
 */
const getSheetNamesApi = async (formData: FormData) => {
  // 从FormData中获取file对象并保存
  const file = formData.get('file') as File;
  if (!file) {
    throw new Error('未找到文件');
  }

  // 保存file对象供后续API调用使用
  currentFile = file;

  // 调用ImportApi的getSheetNames函数
  return ImportApi.getSheetNames(file);
};

/**
 * 适配函数：获取工作表的表头信息
 * @param params 包含sheetName和startRow的参数对象
 * @returns 表头信息
 */
const getSheetHeadersApi = async (params: {
  sheetName: string;
  startRow: number;
}) => {
  if (!currentFile) {
    throw new Error('未找到上传的文件，请先上传文件');
  }

  // 调用ImportApi的getHeaders函数
  return ImportApi.getHeaders(currentFile, params.sheetName, params.startRow);
};

/**
 * 适配函数：获取数据预览
 * @param params 包含sheetName、startRow、limit、fieldMappings和excelHeaders的参数对象
 * @returns 预览数据
 */
const getSheetDataPreviewApi = async (params: {
  excelHeaders?: string;
  fieldMappings?: string;
  limit?: number;
  sheetName: string;
  startRow: number;
}) => {
  if (!currentFile) {
    throw new Error('未找到上传的文件，请先上传文件');
  }

  // 解析字段映射参数
  let parsedFieldMappings: string[] = [];
  try {
    if (params.fieldMappings) {
      parsedFieldMappings = JSON.parse(params.fieldMappings);
    }
  } catch (e) {
    console.error('解析字段映射失败:', e);
  }

  // 调用ImportApi的getPreviewData函数，传递正确的字段映射
  return ImportApi.getPreviewData(
    currentFile,
    params.sheetName,
    params.startRow,
    'warehouse',
    parsedFieldMappings,
  );
};

/**
 * 处理文件变化
 * @param file 新选择的文件
 */
const handleFileChange = (file: File) => {
  currentFile = file;
};

/**
 * 适配函数：执行数据导入
 * @param formData 包含文件和其他参数的FormData
 * @returns 导入结果
 */
const importDataApi = async (formData: FormData) => {
  // 从FormData中获取file对象和其他参数
  const file = formData.get('file') as File;
  const sheetName = formData.get('sheetName') as string;
  const startRow = Number(formData.get('startRow'));
  const fieldMappings =
    JSON.parse(formData.get('fieldMappings') as string) || [];

  if (!file || !sheetName) {
    throw new Error('缺少必要的导入参数');
  }

  // 调用ImportApi的doImport函数，指定模块类型为'warehouse'
  return ImportApi.doImport(
    file,
    sheetName,
    startRow,
    'warehouse',
    fieldMappings,
  );
};

/**
 * 显示导入模态框
 * 直接调用DataImport组件内部的showImportModal方法
 */
const showModal = () => {
  if (dataImportRef.value) {
    dataImportRef.value.showImportModal();
  }
};

/**
 * 隐藏导入模态框
 * 这里实际上由DataImport组件内部处理关闭逻辑
 */
const hideModal = () => {
  // DataImport组件内部已处理关闭逻辑
};

// 暴露方法给父组件使用
defineExpose({
  showModal,
  hideModal,
});

/**
 * 处理导入成功事件
 * @param data 导入成功返回的数据
 */
const handleImportSuccess = (data: any) => {
  console.log('导入成功:', data);
  // 发出成功事件，通知父组件（list.vue）处理成功逻辑
  emit('import-success', data);
};

/**
 * 处理导入失败事件
 * @param error 导入失败的错误信息
 */
const handleImportError = (error: any) => {
  console.error('导入失败:', error);
  // 发出错误事件，通知父组件（list.vue）处理错误逻辑
  emit('import-error', error);
};
</script>

<template>
  <!-- 移除外部Modal嵌套，直接使用DataImport组件 -->
  <DataImport
    ref="dataImportRef"
    title="导入仓库数据"
    :system-fields="warehouseFields"
    :get-sheet-names-api="getSheetNamesApi"
    :get-sheet-headers-api="getSheetHeadersApi"
    :get-sheet-data-preview-api="getSheetDataPreviewApi"
    :import-data-api="importDataApi"
    :on-file-change="handleFileChange"
    @import-success="handleImportSuccess"
    @import-error="handleImportError"
  />
</template>

<style scoped>
/* 无需额外样式，DataImport组件内部已包含完整样式 */
</style>
